package psico_test;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Toolkit;

import javax.swing.JOptionPane;

import psico_test.appAdministrar.appAdministrar;
import psico_test.appCrear.appCrear;
import psico_test.appEjecutar.appEjecutar;
import psico_test.gui.ventanaLogin;
import psico_test.gui.ventanaMenu;
import psico_test.users.Usuario;
import psico_test.utils.bd.BDManager;
import psico_test.utils.file.FileManager;

public class psicoTest extends Thread
{
	private ventanaMenu gui;
	public ventanaMenu getGui() {return gui;}

	private Thread threadGui;
	private ventanaLogin vLogin;
	private Frame fondo;
	
	private BDManager BDManager;
	public BDManager getBDManager() {return BDManager;}
	
	private FileManager FileManager;
	public FileManager getFileManager() {return FileManager;}

	private Usuario usuario = new Usuario();
	public Usuario getUsuario() {return usuario;}
	public void setUsuario(Usuario usuario) {this.usuario = usuario;}

	private appCrear appCrear;
	private appAdministrar appAdministrar;
	private appEjecutar appEjecutar;
	
	public psicoTest() 
	{
		System.out.println("Inicializando fondo de pantalla.");
		espera();
		fondo = new Frame();
		fondo.setUndecorated(true);
		fondo.setBackground(Color.BLACK);
		double h = Toolkit.getDefaultToolkit().getScreenSize().getHeight()*(95/100);
		double w = Toolkit.getDefaultToolkit().getScreenSize().getWidth()*(95/100);
		fondo.setSize(Toolkit.getDefaultToolkit().getScreenSize());
		fondo.setLocationRelativeTo(null);
		fondo.setVisible(true);	
		
		espera();
		FileManager = psico_test.utils.file.FileManager.getInstance();
		System.out.println("Sistema de archivos inicializados y operativos");
		
		BDManager = psico_test.utils.bd.BDManager.getInstance();
		System.out.println("BD inicializada y operativa");
	}
	
	public void run()
	{
		initPsicoTest();
	}
	
	public void initPsicoTest()
	{
		vLogin = new ventanaLogin(this);	
	}
	
	public void login(String user,char[] pass)
	{
		vLogin.dispose();
		
		if(BDManager.autentificar(user, pass))
		{
			FileManager.importarExperimentos();
			gui = new ventanaMenu(this);
			threadGui = new Thread(gui);
			threadGui.start();
		}
		else
		{
			JOptionPane.showMessageDialog(null,"Error en el login!");
			vLogin = new ventanaLogin(this);
		}
			
	}
	
	public void stopPsicoTest()
	{
		System.out.print("Cerrando los componentes visuales");
		espera();
		gui.setVisible(false);
		threadGui.interrupt();
		espera();
		fondo.setVisible(false);
		
		System.out.print("Cerrando instancias");
		this.BDManager.desconectarBD();
		this.stopAppAdministrar();
		this.stopAppCrear();
		this.stopAppEjecutar();
		espera();
		
		System.out.print("Lanzando el recolector de basura");
		System.gc();
		espera();
		
		System.out.print("Saliendo del programa");
		espera();
		System.out.println("Adios! :P");
		
		System.exit(0);
	}

	public void initAppCrear()
	{
		appCrear = new appCrear(this);
		appCrear.start();
		gui.setEnabled(false);
	}
	public void stopAppCrear()
	{
		try
		{
			appCrear.stop();
			gui.setEnabled(true);
		}catch(Exception e)
		{
			
		}
	}
	
	public void initAppEjecutar()
	{
		appEjecutar = new appEjecutar(this);
		appEjecutar.start();
		gui.setEnabled(false);
	}
	public void stopAppEjecutar()
	{
		try
		{
			appEjecutar.stop();
			gui.setEnabled(true);
		}catch(Exception e)
		{
			
		}
	}
	
	public void initAppAdministrar()
	{
		appAdministrar = new appAdministrar(this);
		appAdministrar.start();
		gui.setEnabled(false);
	}
	public void stopAppAdministrar()
	{
		try
		{
			appAdministrar.stop();
			gui.setEnabled(true);
		}catch(Exception e)
		{
			
		}
	}
	
	public void espera()
	{
		for(int i=0; i<5;i++)
		{
			System.out.print(".");
			try{   this.sleep(200);   }catch(InterruptedException e){}
		}
		System.out.println();
	}
}	
	
